home *** CD-ROM | disk | FTP | other *** search
- use strict;
- use warnings;
-
- package namespace::autoclean;
- our $VERSION = '0.09';
-
- # ABSTRACT: Keep imports out of your namespace
-
- use Class::MOP;
- use B::Hooks::EndOfScope;
- use List::Util qw( first );
- use namespace::clean;
-
-
- sub import {
- my ($class, %args) = @_;
-
- my $subcast = sub {
- my $i = shift;
- return $i if ref $i eq 'CODE';
- return sub { $_ =~ $i } if ref $i eq 'Regexp';
- return sub { $_ eq $i };
- };
-
- my $runtest = sub {
- my ($code, $method_name) = @_;
- local $_ = $method_name;
- return $code->();
- };
-
- my $cleanee = exists $args{-cleanee} ? $args{-cleanee} : scalar caller;
-
- my @also = map { $subcast->($_) } (
- exists $args{-also}
- ? (ref $args{-also} eq 'ARRAY' ? @{ $args{-also} } : $args{-also})
- : ()
- );
-
- on_scope_end {
- my $meta = Class::MOP::Class->initialize($cleanee);
- my %methods = map { ($_ => 1) } $meta->get_method_list;
- $methods{meta} = 1 if $meta->isa('Moose::Meta::Role') && Moose->VERSION < 0.90;
- my %extra = ();
-
- for my $method (keys %methods) {
- next if exists $extra{$_};
- next unless first { $runtest->($_, $method) } @also;
- $extra{ $method } = 1;
- }
-
- my @symbols = keys %{ $meta->get_all_package_symbols('CODE') };
- namespace::clean->clean_subroutines($cleanee, keys %extra, grep { !$methods{$_} } @symbols);
- };
- }
-
- 1;
-
- __END__
-
- =pod
-
- =head1 NAME
-
- namespace::autoclean - Keep imports out of your namespace
-
- =head1 VERSION
-
- version 0.09
-
- =head1 SYNOPSIS
-
- package Foo;
- use namespace::autoclean;
- use Some::Package qw/imported_function/;
-
- sub bar { imported_function('stuff') }
-
- # later on:
- Foo->bar; # works
- Foo->imported_function; # will fail. imported_function got cleaned after compilation
-
- =head1 DESCRIPTION
-
- When you import a function into a Perl package, it will naturally also be
- available as a method.
-
- The C<namespace::autoclean> pragma will remove all imported symbols at the end
- of the current package's compile cycle. Functions called in the package itself
- will still be bound by their name, but they won't show up as methods on your
- class or instances.
-
- This module is very similar to L<namespace::clean|namespace::clean>, except it
- will clean all imported functions, no matter if you imported them before or
- after you C<use>d the pragma. It will also not touch anything that looks like a
- method, according to C<Class::MOP::Class::get_method_list>.
-
- If you're writing an exporter and you want to clean up after yourself (and your
- peers), you can use the C<-cleanee> switch to specify what package to clean:
-
- package My::MooseX::namespace::autoclean;
- use strict;
-
- use namespace::autocleanclean (); # no cleanup, just load
-
- sub import {
- namespace::autoclean->import(
- -cleanee => scalar(caller),
- );
- }
-
- =head1 PARAMETERS
-
- =head2 -also => [ ITEM | REGEX | SUB, .. ]
-
- =head2 -also => ITEM
-
- =head2 -also => REGEX
-
- =head2 -also => SUB
-
- Sometimes you don't want to clean imports only, but also helper functions
- you're using in your methods. The C<-also> switch can be used to declare a list
- of functions that should be removed additional to any imports:
-
- use namespace::autoclean -also => ['some_function', 'another_function'];
-
- If only one function needs to be additionally cleaned the C<-also> switch also
- accepts a plain string:
-
- use namespace::autoclean -also => 'some_function';
-
- In some situations, you may wish for a more I<powerful> cleaning solution.
-
- The C<-also> switch can take a Regex or a CodeRef to match against local
- function names to clean.
-
- use namespace::autoclean -also => qr/^_/
-
- use namespace::autoclean -also => sub { $_ =~ m{^_} };
-
- use namespace::autoclean -also => [qr/^_/ , qr/^hidden_/ ];
-
- use namespace::autoclean -also => [sub { $_ =~ m/^_/ or $_ =~ m/^hidden/ }, sub { uc($_) == $_ } ];
-
- =head1 SEE ALSO
-
- L<namespace::clean>
-
- L<Class::MOP>
-
- L<B::Hooks::EndOfScope>
-
-
-
- =head1 AUTHOR
-
- Florian Ragwitz <rafl@debian.org>
-
- =head1 COPYRIGHT AND LICENSE
-
- This software is copyright (c) 2009 by Florian Ragwitz.
-
- This is free software; you can redistribute it and/or modify it under
- the same terms as the Perl 5 programming language system itself.
-
- =cut
-
-
-